home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ADA Programming Guide
/
ADA Programming Guide.iso
/
ada_gwu
/
compile.c
< prev
next >
Wrap
C/C++ Source or Header
|
1996-01-30
|
16KB
|
581 lines
/*
GWAda Development Environment for 386/486 PCs
Copyright (C) 1993, Arthur Vargas Lopes & Michael Bliss Feldman
vlopes@vortex.ufrgs.br mfeldman@seas.gwu.edu
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/* Compile.c */
#include <externs.h>
extern void AVL_MAKE_UNIT_DATE(AVL_EDIT_WINDOW_PTR w);
char *AVL_RUN_SELECT(AVL_UNITDT_PTR w)
{
AVL_WIN_PTR temp = NULL, temp2 = NULL;
short rows, cols;
int i, j, k, n = 0, nc = 0;
char msg[50];
char *ru;
static AVL_BIND_SIZE r[50];
AVL_BIND_SIZE c[50];
/* Pick obsolete units for compilation */
for(i = 0; i < w -> ns && n < 50; ++i)
if (w -> s[i].status == 'A' && w -> s[i].is_main == ' ' &&
w -> s[i].fu[0] == 'b') {
AVL_MAKE_BNAME(w -> s[i].fu, msg);
ru = msg;
j = strlen(ru);
if (j > 10 ) {
j = j - 10;
if (!strcmp("_idle_task",ru+j))
*(ru+j) = '\0';
}
strcpy(r[n].name,msg);
++n;
}
if (n > 0)
i = AVL_UNIT(r,n);
else {
i = -1;
AVL_ERROR("First compile any executable program unit.");
}
AVL_DEL_WINDOW(temp2);
if (i >= 0)
return r[i].name;
return NULL;
}
int AVL_EX_UNIT(char *name, char *opts[17])
{
int cmd_ret_code, i;
char msg[100];
cmd_ret_code = spawnvp(P_WAIT,name,opts);
if (cmd_ret_code == -1) {
switch( errno ) {
case E2BIG : sprintf(msg,"E2BIG"); break;
case EINVAL: strcpy(msg,"The mode argument is invalid."); break;
case ENOENT: sprintf(msg,"File or path name not found: %s",name); break;
case ENOEXEC : sprintf(msg,
"The specified file is not an executable or has an inv. exec-file format: '%s'",name); break;
case ENOMEM : strcpy(msg,
"Not enough memory is available to execute the child process."); break;
default : sprintf(msg,"errno = %d, could not know...", errno); break;
}
AVL_ERROR(msg);
return 0;
}
return 1;
}
int AVL_COMP_SETUP(AVL_EDIT_WINDOW_PTR w)
{
AVL_WIN_PTR temp;
FILE *fp, *fopen();
struct find_t c_file;
char lookat[AVL_MAX_FILE_NAME+1];
short i;
char msg[AVL_MAX_FILE_NAME+100];
unsigned att;
sprintf(lookat,"%s",avl_dir_library);
i = _dos_findfirst( lookat, _A_SUBDIR, &c_file );
if (!i) {
i = _dos_getfileattr(lookat,&att);
if (att != _A_SUBDIR) {
sprintf(msg," Library %s does not exist! ",avl_dir_library);
msg[77] = '\0';
temp = AVL_MAKE_WINDOW(msg,5,9,12,71,avl_wnd_bk_color,avl_wnd_color);
_outtext(" Your current directory contains a file that has the same\n");
_outtext(" name of the current library. Before creating a new library\n");
_outtext(" (Alt-O N) either change this file name or change the\n");
_outtext(" current library name (Alt-O D).\n\n");
_outtext("Press any key to continue...");
i = getch();
if (i == 0) i = getch();
AVL_DEL_WINDOW(temp);
return 1;
}
sprintf(msg,"%s\\LIB",avl_dir_library);
fp = fopen(msg,"r");
if (fp == NULL) {
sprintf(msg," Library %s has been corrupted! ",avl_dir_library);
msg[77] = '\0';
temp = AVL_MAKE_WINDOW(msg,5,9,11,71,avl_wnd_bk_color,avl_wnd_color);
_outtext(" Your current library has been corrupted. It is suggested\n");
_outtext(" a new library, that is, create a new library by pressing\n");
_outtext(" the Alt-O N keys.\n\n");
_outtext("Press any key to continue...");
i = getch();
if (i == 0) i = getch();
AVL_DEL_WINDOW(temp);
return 1;
}
}
if (i) {
sprintf(msg," Library %s does not exist! ",avl_dir_library);
msg[77] = '\0';
temp = AVL_MAKE_WINDOW(msg,5,9,11,71,avl_wnd_bk_color,avl_wnd_color);
_outtext(" A library must be created before compiling any program.\n");
_outtext(" Pressing the Alt-O N keys will create a library for you.\n");
_outtext(" To change the current library press the Alt-O D keys.\n\n");
_outtext("Press any key to continue...");
i = getch();
if (i == 0) i = getch();
AVL_DEL_WINDOW(temp);
return 1;
}
avl_blank_line[0] = '\0';
w -> fix = AVL_FIX;
w -> options = AVL_READ_OPTIONS;
w -> delete = AVL_DEL_WINDOW;
w -> error = AVL_ERROR;
w -> line_no = 0;
w -> no_errors = 0;
w -> avl_win1 = NULL;
if (w -> changed)
AVL_SAVE();
w -> changed = '\0';
return 0;
}
int AVL_DO_COMPILATION(char *s, int pause)
{
AVL_EDIT_WINDOW_PTR w;
int lex, syntax, semantic, bind, gen, nopt = 0, n, i;
FILE *fp, *fopen();
AVL_WIN_PTR temp;
char msg[100];
char *opts[17];
char compiling[121];
avl_w = w = &avl_windows[avl_window];
fp = fopen("COMPILE.CK$","w");
fclose(fp);
temp = AVL_MAKE_WINDOW(" N.Y.U. Ada Compiler "
,5,1,8,80,avl_wnd_bk_color,avl_wnd_color);
sprintf(compiling," Compiling %s, please wait ...\n", s);
_outtext(compiling);
opts[nopt++] = "Adacomp";
opts[nopt++] = "-a";
opts[nopt++] = "-s";
opts[nopt++] = "-l";
opts[nopt++] = avl_dir_library;
sprintf(msg,"%s",s);
opts[nopt++] = msg;
opts[nopt++] = NULL;
unlink("gwada.smm");
if (AVL_EX_UNIT("ADACOMP", opts)) ;
AVL_DEL_WINDOW(temp);
avl_open_error_file = 0;
fp = fopen("GWADA.SMM","r");
if (fp == NULL)
w -> no_errors = 0;
else {
fscanf(fp, "%d", &w -> no_errors);
fscanf(fp, "%d", &lex);
fscanf(fp, "%d", &syntax);
fscanf(fp, "%d", &semantic);
fscanf(fp, "%d", &bind);
fscanf(fp, "%d", &gen);
fclose(fp);
}
if (w -> no_errors > 0) {
n = 0;
if (lex) ++n;
if (syntax) ++n;
if (semantic) ++n;
if (bind) ++n;
if (gen) ++n;
temp = AVL_MAKE_WINDOW(" N.Y.U. Ada Compiler - Error Summary "
,5,1,7+n,80,avl_wnd_bk_color,avl_wnd_color);
_settextposition(1,2);
sprintf(msg," %d error%s detected:", w -> no_errors, (w -> no_errors == 1) ? "" : "s");
_outtext(msg);
n = 0;
_settextposition(2,2);
if (lex > 0) {
++n;
sprintf(msg," %d lexical error%s. ", lex, (lex == 1) ? "" : "s");
_outtext(msg);
}
if (syntax > 0) {
_settextposition(2+n++,2);
sprintf(msg," %d syntactical error%s. ", syntax, (syntax == 1) ? "" : "s");
_outtext(msg);
}
if (semantic > 0) {
_settextposition(2+n++,2);
sprintf(msg," %d semantical error%s. ", semantic, (semantic == 1) ? "" : "s");
_outtext(msg);
}
if (bind > 0) {
_settextposition(2+n++,2);
sprintf(msg," %d binding error%s. ", bind, (bind == 1) ? "" : "s");
_outtext(msg);
}
if (gen > 0) {
_settextposition(2+n++,2);
sprintf(msg," %d code generating error%s. ", gen, (gen == 1) ? "" : "s");
_outtext(msg);
}
if (pause) {
i = getch(); if (i == 0) i = getch();
}
AVL_DEL_WINDOW(temp);
avl_open_error_file = 1;
lex = 1;
}
else {
temp = AVL_MAKE_WINDOW(" N.Y.U. Ada Compiler ",5,1,9,80,avl_wnd_bk_color,avl_wnd_color);
_settextposition(1,2);
fp = fopen("COMPILE.CK$","r");
if (fp != NULL) {
sprintf(msg," Compilation failed! Check installation. ");
fclose(fp);
lex = 1;
}
else {
sprintf(msg," Program %s compiled with success.\n\n Press any key to continue...", s);
lex = 0;
}
_outtext(msg);
if (pause) {
i = getch(); if (i == 0) i = getch();
}
AVL_DEL_WINDOW(temp);
}
return lex;
}
void AVL_COMPILE_CURRENT()
{
AVL_EDIT_WINDOW_PTR w;
avl_w = w = &avl_windows[avl_window];
if (AVL_COMP_SETUP(w)) return;
strcpy(current_file_name,w -> file_name);
if (AVL_DO_COMPILATION(w -> file_name,1));
}
/*
void AVL_COMP_ORDER()
{
AVL_EDIT_WINDOW_PTR w;
AVL_WIN_PTR temp;
AVL_WIN_PTR m1, m2;
char *opts[19];
int nopt = 0;
char msg[100];
char s[121];
char s2[121];
char search_space[10][128];
static char *msgc = "GWAda - Consider which set of files? ";
int i, j, n, n1, n2;
int no_units, larger;
static int first = 0;
static char lastfn[121];
static char fname[121];
char compiling[121];
FILE *fp2, *fopen();
avl_w = w = &avl_windows[avl_window];
n1 = 62;
n2 = (80 - n1) / 2;
m1 = AVL_MAKE_WINDOW(msgc,7,n2,9,n1+n2,avl_wnd_bk_color,avl_wnd_color);
if (first == 0)
sprintf(lastfn,"%s%c*.ada",avl_dir_sources,92);
first = 1;
strcpy(fname,lastfn);
if (AVL_PROMPT(1,1,fname,60)) {
AVL_DEL_WINDOW(m1);
return;
}
strcpy(lastfn,fname);
for(i = 0, j = 0, n = 0; i < strlen(fname); ++i)
if (isspace(fname[i])) {
search_space[n++][j] = '\0';
j = 0;
while(isspace(fname[i])) ++i;
--i;
}
else
search_space[n][j++] = fname[i];
search_space[n++][j] = '\0';
AVL_DEL_WINDOW(m1);
temp = AVL_MAKE_WINDOW(" GWAda Bottom Up Parts Compiler "
,2,1,9,80,avl_wnd_bk_color,avl_wnd_color);
sprintf(compiling," Building compilation order for %s\n Please wait ...\n"
, w -> file_name );
_outtext(compiling);
opts[nopt++] = "GWADACO";
opts[nopt++] = avl_dir_library;
opts[nopt++] = w -> file_name;
for(i = 0; i < n; ++i)
opts[nopt++] = search_space[i];
opts[nopt++] = NULL;
if (AVL_EX_UNIT("GWADACO", opts)) ;
fp2 = fopen("AVLCOMPO.DAT","r");
if (fp2 == NULL) {
AVL_ERROR("Request failed! Check installation or set of files");
AVL_DEL_WINDOW(temp);
return;
}
AVL_DEL_WINDOW(temp);
j = 0;
fscanf(fp2,"%d %d", &no_units, &larger);
sprintf(compiling," Units Compiled ");
if (larger < strlen(compiling)) larger = strlen(compiling);
larger += 2;
if (larger > 74) larger = 74;
if (no_units > 18) no_units = 18;
i = (76 - larger);
n = 23 - no_units;
m2 = AVL_MAKE_WINDOW(compiling,n,i,n+no_units+1,i+larger+2,avl_txt_bk_color,avl_txt_color);
while ( fscanf(fp2,"%s",s2) != EOF) {
sprintf(s, "%s",s2);
sprintf(compiling,"\n %s",s);
strcpy(current_file_name,s);
if (AVL_COMP_SETUP(w)) {
fclose(fp2);
AVL_DEL_WINDOW(m2);
return;
}
if (AVL_DO_COMPILATION(s,0)) {
fclose(fp2);
AVL_DEL_WINDOW(m2);
return;
}
_outtext(compiling);
++j;
}
if (j == 0)
AVL_ERROR("There is nothing to compile");
else {
temp = AVL_MAKE_WINDOW(" N.Y.U. Ada Compiler ",5,1,9,80,avl_wnd_bk_color,avl_wnd_color);
_settextposition(1,2);
sprintf(msg," %d unit%s compiled with success.\n\n Press any key to continue..."
, j, (j > 1) ? "s" : "" );
_outtext(msg);
i = getch(); if (i == 0) i = getch();
AVL_DEL_WINDOW(temp);
}
AVL_DEL_WINDOW(m2);
fclose(fp2);
}
*/
void AVL_COMPILE()
{
AVL_EDIT_WINDOW_PTR w;
char msg[100];
char s[121];
static char *msgc = "GWAda - Compile which file? ";
char *opts[17];
int nopt = 0;
int i, n, n1, n2;
AVL_WIN_PTR m1;
AVL_SOURCE_SIZE t;
static int first = 0;
static char lastfn[121];
char fname[121];
avl_w = w = &avl_windows[avl_window];
n1 = 62;
n2 = (80 - n1) / 2;
m1 = AVL_MAKE_WINDOW(msgc,7,n2,9,n1+n2,avl_wnd_bk_color,avl_wnd_color);
if (first == 0)
sprintf(lastfn,"%s%c*.ada",avl_dir_sources,92);
first = 1;
strcpy(fname,lastfn);
if (AVL_PROMPT(1,1,fname,60)) {
AVL_DEL_WINDOW(m1);
return;
}
strcpy(lastfn,fname);
AVL_GET_FILE_NAMES(&t,fname);
AVL_DEL_WINDOW(m1);
if (t.no_files == 0) {
sprintf(s,"Can't find any file under \'%s\'",fname);
AVL_ERROR(s);
return;
}
s[0] = '\0';
if ((n = AVL_SOURCES(&t,t.no_files,fname)) < 0) return;
for(i = strlen(fname) - 1; t.no_files > 0 && i > 0; --i) {
if (fname[i] == 92 && i > 0) {
fname[i+1] = '\0';
i = -10;
break;
}
}
if (i < -1)
sprintf(s,"%s%s",fname,t.name[n]);
else
sprintf(s, "%s",t.name[n]);
if (s[0] == '\0')
return;
strcpy(current_file_name,s);
if (AVL_COMP_SETUP(w)) return;
AVL_DO_COMPILATION(s,1);
}
void AVL_NEW_LIB()
{
AVL_EDIT_WINDOW_PTR w;
AVL_WIN_PTR temp;
char msg[100];
char *opts[17];
int cmd_ret_code, i;
FILE *fp, *fopen();
w = &avl_windows[avl_window];
fp = fopen("DUMMY.ADA","w");
if (fp == NULL) {
AVL_ERROR("Can't create new library! Check disk space...");
return;
}
fprintf(fp," PROCEDURE DUMMY IS BEGIN NULL; END DUMMY; ");
fclose(fp);
w -> no_errors = 0;
sprintf(msg,"%s\\LIB",avl_dir_library);
fp = fopen(msg,"r");
if (fp == NULL) {
rmdir(avl_dir_library);
if (mkdir(avl_dir_library)) {
sprintf(msg,"Unable to create library '%s'",avl_dir_library);
AVL_ERROR(msg);
return;
}
}
else
fclose(fp);
temp = AVL_MAKE_WINDOW(" N.Y.U. Ada Compiler "
,5,1,8,80,avl_wnd_bk_color,avl_wnd_color);
_outtext("Creating new library, please wait...\n");
opts[0] = "AdaComp";
opts[1] = "-n";
opts[2] = "-l";
opts[3] = avl_dir_library;
opts[4] = "dummy.ada";
opts[5] = NULL;
unlink("gwada.smm");
if (AVL_EX_UNIT("ADACOMP", opts)) ;
avl_open_error_file = 0;
fp = fopen("GWADA.SMM","r");
if (fp == NULL)
w -> no_errors = 0;
else {
fscanf(fp, "%d", &w -> no_errors);
fclose(fp);
}
if (w -> no_errors > 0)
AVL_ERROR("Library was not created properly!");
unlink("dummy.ada");
AVL_DEL_WINDOW(temp);
}
void AVL_RUN()
{
AVL_UNITDT w;
AVL_EDIT_WINDOW_PTR ww;
AVL_WIN_PTR temp;
FILE *fp;
char msg[100];
char m2[4][12];
char t_opts[12];
short ncmd = 0;
short ti = 0;
char *opts[19];
char *runit;
short nopt = 0;
short cmd_ret_code, i;
avl_blank_line[0] = '\0';
ww = &avl_windows[avl_window];
w.ns = 0;
opts[0] = "Adalib2";
opts[1] = "-l";
opts[2] = avl_dir_library;
opts[3] = NULL;
temp = AVL_MAKE_WINDOW(" Run ",5,1,9,80,avl_wnd_bk_color,avl_wnd_color);
_outtext(" Searching library. Please, wait a moment...\n");
if (AVL_EX_UNIT("ADALIB2", opts)) ;
AVL_DEL_WINDOW(temp);
AVL_MAKE_UNIT_DATE(&w);
if (w.ns == 0) {
AVL_ERROR("First compile any executable program unit.");
return;
}
runit = AVL_RUN_SELECT(&w);
if (runit == NULL)
return;
temp = AVL_MAKE_WINDOW(" N. Y. U. Ada Interpreter "
,11,1,14,80,avl_wnd_bk_color,avl_wnd_color);
_outtext("Loading interpreter, please wait...");
_settextposition(2,2);
if (avl_trace_opts[0]) t_opts[ti++] = 'a';
if (avl_trace_opts[1]) t_opts[ti++] = 'c';
if (avl_trace_opts[2]) t_opts[ti++] = 'e';
if (avl_trace_opts[3]) t_opts[ti++] = 'r';
if (avl_trace_opts[4]) t_opts[ti++] = 's';
if (avl_trace_opts[5]) t_opts[ti++] = 't';
if (ti) t_opts[ti] = '\0';
opts[nopt++] = (avl_monitor_on) ? "gwumon" : "adaexec";
opts[nopt++] = "-m";
opts[nopt++] = runit;
if (!avl_monitor_on) {
if (avl_heap) {sprintf(m2[0],"%d",avl_heap); opts[nopt++]="-h"; opts[nopt++]=m2[0];}
if (avl_pgm_stack) {sprintf(m2[1],"%d",avl_pgm_stack); opts[nopt++]="-p"; opts[nopt++]=m2[1];}
if (avl_task_stack) {sprintf(m2[2],"%d",avl_task_stack); opts[nopt++]="-s"; opts[nopt++]=m2[2];}
}
if (avl_scheduller) {sprintf(m2[3],"%d",avl_scheduller); opts[nopt++]="-r"; opts[nopt++]=m2[3];}
if (!avl_monitor_on)
if (ti) {
opts[nopt++] = "-t";
opts[nopt++] = t_opts;
}
opts[nopt++] = avl_dir_library;
opts[nopt++] = NULL;
_setvideomode( _DEFAULTMODE );
_settextrows( 25 );
_clearscreen( _GCLEARSCREEN );
if (AVL_EX_UNIT((avl_monitor_on) ? "GWUMON" : "ADAEXEC", opts)) {
printf("\n\nPress any key to return to GWAda ...");
i = getch(); if (i == 0) i = getch();
}
AVL_DEL_WINDOW(temp);
}